package com.huilian.iotbox.data.dto;

import com.huilian.iotbox.data.enums.DeviceTypeEnum;
import com.huilian.iotbox.data.po.Device;
import com.huilian.iotbox.data.vo.CommodityVo;
import com.huilian.iotbox.data.vo.DeviceVo;
import lombok.*;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@ToString(callSuper = true)
public class DeviceDto extends QueryParam implements Serializable {

    private static final long serialVersionUID = -1110659298892208617L;
    private Integer id;
    /**
     * 设备号
     */
    private String deviceNo;
    /**
     * 别名
     */
    private Integer alias;
    /**
     * 设备类型id
     */
    private Integer deviceTypeId;
    private String password;
    /**
     * 设备厂商类型
     */
    private Integer vendorId;
    /**
     * mqtt服务商
     */
    private Integer serviceProvider;
    /**
     * 门店id，未绑定门店统一用-1
     */
    private Integer merchantStoreId;
    /**
     * 顶级代理id，主要用于生产新设备号时用到
     */
    private Integer agencyId;
    /**
     * 设备交易总金额
     */
    private BigDecimal totalTransactionAmount;
    /**
     * 设备返佣状态  0/null 未返佣  1已返佣
     */
    private Integer rebateStatus;

    /**
     * 产品id
     */
    private Integer productId;
    /**
     * 设备状态：0、下架，1、上架，2、故障，3、未激活，4、解绑，5、维修替换
     */
    private Integer status;
    /**
     * 为了与全选 批量启用/禁用设备的status区分开
     * 设备状态：0、下架，1、上架，2、故障，3、未激活，4、解绑，5、维修替换
     */
    private Integer updateStatus;
    /**
     * 网络强度
     */
    private Integer networkIntensity;
    /**
     * 最后上报心跳时间
     */
    private Date lastHeartbeat;
    /**
     * 每局多少币
     */
    private Integer rateEach;
    /**
     * 波特率id
     */
    private Integer baudId;
    /**
     * 协议版本：1、旧版，2、新板
     */
    private Integer agreementVersion;
    /**
     * 固件版本号
     */
    private Integer firmwareVersion;
    /**
     * 向外投币电平
     */
    private Integer level;
    /**
     * SIM_ICC_ID(物联卡号)
     */
    private String SIM_ICC_ID;
    /**
     * 脉冲功能开关
     */
    private Boolean pulseSwitchState;
    /**
     * 数据位
     */
    private Integer dataBit;
    /**
     * 校验位
     */
    private Integer parityBit;
    /**
     * 停止位
     */
    private Integer stopBit;
    /**
     * 故障代码，根据厂家设置，默认为0
     */
    private Integer faultCode;
    /**
     * 心跳时间
     */
    private Integer heartbeatTime;
    /**
     * 出礼模式
     */
    private Integer ritualModel;


    /**
     * 套餐有效期时间
     */
    private Integer ncetId;

    private Integer netCardReplaceStatus;

    /**
     * 设备备注名称，方便记忆
     */
    private String remarkName;

    /**
     * 兑币机类型时，是否需要兑币机主板来投币。1：代表外部设备（兑币机主板来投币），0、null和其他：系统来投币。仅支持脉冲投币+纸钞机串口。
     */
    private Boolean isCoinOperated;

    /**
     * 充电费率
     */
    private Long chargingPileRateId;
    /**
     * userid
     */
    private Integer userId;


    private Boolean moneySort;

    private Boolean coinSort;

    private String time;

    /**
     * 开关机类型：开机：startup，关机：shutdown
     */
    private String type;

    /**
     * 新设备数量
     */
    private Integer newDeviceNumber;

    /**
     * 测试协议
     */
    private String tcp;

    /**
     * 常开常闭
     */
    private String nonc;

    /**
     * 本月或者上月
     */
    private Integer month;

    private Integer dateType;

    private String startDevice;

    private String endDevice;

    private String startTime;

    private String endTime;

    // 不绑定的设备Id
    private List<Device> notDistributionDeviceList;

    /**
     * 是否重新分配 0：不重新分配，1：重新分配
     */
    private Integer isAnew;

    /**
     * 现有库存
     */
    private Integer existStock;
    /**
     * 备用库存
     */
    private Integer reserveStock;
    /**
     * 预警库存
     */
    private Integer warnStock;
    /**
     * 使能，0：启用 1：禁用
     */
    private Boolean enabled;

    private Integer deviceCount;

    /**
     * 登录账号
     **/
    private String username;
    /**
     * 用户名称
     **/
    private String name;
    /**
     * 新设备
     */
    private String newDeviceNo;
    /**
     * 购买单价
     */
    private BigDecimal price;
    /**
     * 游戏时间
     */
    private Integer gameTime;
    private Integer deviceId;

    private Boolean shoutMachineStatus;
    /**
     * 是否启用库存预警
     */
    private Boolean enableWarnStock;
    /**
     * 位置编号，扭蛋机称为仓位
     */
    private Integer positionId;
    /**
     * 商品id
     */
    private Long goodsId;

    private String operatePassword;

    /**
     * 加密串
     */
    private String sign;
    /**
     * 时间戳
     */
    private Long timestamp;

    private List<DeviceVo> deviceVoList;

    private Integer cmdId;

    private List<DeviceDto> deviceDtoList;

    private List<AppFileDto> appFileDtoList;

    private Integer[] merchantStoreIdList;

    private String token;
    private Long memberId;

    private Integer merchantBannerType;
    /**
     * 自动投币
     */
    private Boolean automaticCoin;

    /**
     * 套餐有效期时间
     */
    private Integer kwh;
    /**
     * 脉冲间隔，毫秒。控制出币速度，数值越高就越慢
     */
    private Integer gapLength;
    /**
     * 脉冲长度，毫秒。决定反应时间
     */
    private Integer pulseLength;
    /**
     * 儿童车启动或暂停
     */
    private Boolean isStartAndStop;
    /**
     * 默认标志为游戏时间
     */
    private Integer isGameTime;

    private String cmd;
    /**
     * 安卓板型号
     */
    private String androidMotherboardModel;
    /**
     * cpuId
     */
    private String cpuId;
    private String agencyNo;
    /**
     * 超级兑币机。0/null：不是，1：是
     */
    private Boolean isAndroid;
    /**
     * 存币存票机。0/null：不是，1：是
     */
    private Boolean isDepositCoinsAndBills;
    /**
     * 门闸机。0/null：不是，1：是
     */
    private Boolean isGate;
    /**
     * 售货机。0/null：不是，1：是
     */
    private Boolean isVendmach;
    /**
     * 已分配。0/null：不是，1：是
     */
    private Boolean isAllocated;

    private List<Integer> deviceIds;

    /**
     * 是否可见
     */
    private Boolean visible;

    /**
     * 参数类型：1、原有功能，2、自定义协议
     */
    private Integer funcType;

    /**
     * 精准搜索用设备号
     */
    private String precisionNo;

    /**
     * 范围所有设备号
     */
    private String startNo;
    private String endNo;

    /**
     * 单位
     */
    private String measuringUnit;

    /**
     * true：清除游戏时间 / false:重启主机
     */
    private Boolean showSharedArcadeBoolean;
    /**
     * 小于4为投币类型，大于3公共类型
     */
    private Integer isInsertCoinType;

    /**
     * 设备ID 数组
     */
    private Integer[] chooseDeviceId;

    /**
     * 用于 币数/局 和库存
     */
    private Integer rateEachOrStock;

    /**
     * 转场的场地ID
     */
    private Integer newMerchantStore;
    /**
     * 预测当前串口主板的下一个账目上报的自增码
     */
    private Integer nextUploadAccountCode;

    /**
     * 商品id
     */
    private Long commodityId;

    private Integer freightLane;

    private Integer hierarchy;

    private List<CommodityDto> commodityDtoList;

    public Integer autoIncrementUploadAccountCode(Integer nextUploadAccountCode) {
        if (nextUploadAccountCode >= 255) {
            return 1;
        }
        return ++nextUploadAccountCode;
    }


    /**
     * 质保期提醒
     */
    private Boolean enableWarnPeriodReminder;

    /**
     * 质保期，格式年月日时分秒
     */
    private Date warranty;

    private List<CommodityVo> commodityItemList;

    private String cgName;
    private Integer cgId;


    private String cName;
    private String fileName;
    private Integer stock;
    private BigDecimal retailPrice;
    private Integer commodityGroupId;
    private Integer capacity;

    /**
     * 售货机设备类型id
     */
    private List<Integer> vendingMachine;

    /**
     * 商品分类开关
     */
    private Boolean commodityGroupSwitch;


    /**
     * 重试功能，如兑币机出币失败重试，售货机出货失败重试。0/null：不重试，1：重试
     */
    private Boolean retry;

    private Integer num;//售货机单个商品购买数量

    private Long displayRackItemId;

    private Integer hierarchyTotal;
    private Integer freightLaneTotal;
    private Boolean displayRackItemStatus;
    private Long commodityStoreUpDownId;
    /**
     * 自动退款，0/null：不退，1：自动退
     */
    private Boolean autoRefund;

    /**
     * 购物车（暂时售货机用），0/null：不开，1：开启
     */
    private Boolean shoppingCart;

    /**
     * 购物车容量（暂时售货机用）
     */
    private Integer shoppingCartCapacity;

    /**
     * 商品展示类型：1、按货道顺序展示商品（同类商品不合并）
     * ，2、按商品排序展示，其实就是按商品合并展示
     */
    private Integer productDisplayType;

    /**
     * 货道别名
     */
    private String displayRackItemAlias;

    private List<DeviceVo> aisleList = new ArrayList<>();

    /**
     * 设备注册类型：1、超级兑币机，2、存币存票机，3、门闸机
     */
    private Integer deviceRegisterType;
    /**
     * 出礼脉冲间隔
     */
    private Integer outgoingGapLength;
    /**
     * 出礼脉冲长度
     */
    private Integer outgoingPulseLength;

    /**
     * 原来判断是否全选所有设备
     */
    private Boolean deviceAllSelected;
    /**
     * 0/null 不做要求 1带反馈  2不带反馈 （暂时售货机用）
     */
    private Integer feedback;

    /**
     * 是否售货机
     */
    private Boolean isVendingMachine;

    private Integer[] vendingMachineList = {
            DeviceTypeEnum.VENDING_MACHINE.getCode(),
            DeviceTypeEnum.SCREEN_VENDING_MACHINE.getCode(),
            DeviceTypeEnum.OPEN_DOOR_VENDING_MACHINE.getCode(),
            DeviceTypeEnum.BLEND_VENDING_MACHINE.getCode(),
    };

    private List<Integer> deviceTypeIdList;
    /**
     * websocketID
     */
    private String socketId;
    /**
     * 登陆标识
     */
    private Integer loginId;

    private String storeName;

    private Integer vendingMachineType;
    /**
     * 父展架ID
     */
    private Long displayRackId;
    /**弹簧总层数量*/
    private Integer springMachineHierarchyTotal;
    /**是否支持蓝牙 */
    private Boolean isBluetooth;
    /**
     * 商品详情页，0/null.关闭，1.打开（暂时售货机用）
     */
    private Boolean commodityDetailSwitch;
    private String outTradeNo;

    private Integer syntheticType;
    private Integer batteryNumber;
    /**灯光控制，0.关闭/默认值，1.打开*/
    private Boolean lightControl;
    /**风扇控制，0.关闭/默认值，1.打开*/
    private Boolean fanControl;
    /**温度控制，0.关闭/默认值，1.制冷，2.制热*/
    private Integer temperatureControl;
    /**压缩机启动温度*/
    private Integer compressorStartingTemperature;
    /**压缩机停止温度*/
    private Integer compressorStopTemperature;

//    private Date LampStartupTime;
//    /**压缩机停止温度*/
//    private Date LampStopTime;

    private BigDecimal lockTime;

    /**   行线  0/null不设置 1 正  2 反 */
    private Integer hierarchySequence;
    /**   列线0/null不设置 1 正  2 反*/
    private Integer freightLaneSequence;
    /**   反馈0/null不设置 1 正  2 反*/
    private Integer reverseSequence;
    /**   反转线序，层当列用，列当层用（适配中吉）0/null不设置 1 正常线序  2 反转*/
    private Integer feedbackSequence;
    /**出货时间，默认4毫秒，售货机用的，超过这个时间售货机机器就会停止运行，光眼需要用到*/
    private Integer deliveryTime;
    private Integer compressorCurrentTemperature;

    private String lampStartupTime;
    private String lampStopTime;

    private Integer modeType;

    private Integer payLimitTime;
}
